/**
 * @brief FIFO测试文件。FIFO单元为struct。
 *        使用函数fifo_data和fifo_head来获取FIFO单元，直接操作单元数据
 *
 */
#include <stdio.h>
#include <stdlib.h>
//#include <stdint.h>

/*  includes    */
#include "../src/mf_fifo.h"
/*  includes    */

typedef struct
{
    u32 id;
    u8 data[8];
    u8 len;
    u8 ide;
    u8 rsvd[2];
} CANMsg_t;     // 数据结构。FIFO 的单元数据结构

/**< 变量定义 */
#define DATA_SIZE   20U     // 数据 buffer 大小
CANMsg_t buf[DATA_SIZE];    // 定义数据 buffer
/**< 变量定义 */

int main()
{
    uint16_t i = 0U;
    CANMsg_t *pmsg;

    FIFO_t fifo;    // 定义 FIFO

    /*  FIFO 初始化    */
    if(fifo_init(&fifo, buf, sizeof(buf[0]), sizeof(buf)/sizeof(buf[0])) == MF_TRUE)
    {
        printf("FIFO 初始化成功!\n\tunit:%d\t\tsize:%d\n\n",
               fifo_unit(&fifo), fifo_size(&fifo));
    }
    else
    {
        printf("FIFO 初始化失败!\n");
//        getchar();
        return 0U;
    }

    /*  向 FIFO 写数据    */
    printf("FIFO 写数据:\n\tlength:%d\n\n", fifo_len(&fifo));
    while(!FIFO_IS_FULL(&fifo))
    {
        pmsg = ((CANMsg_t *)fifo_data(&fifo)) + fifo_tail(&fifo);
        pmsg->id = 1000U + i;
        pmsg->data[0] = i;
        pmsg->data[1] = i+1U;
        pmsg->data[2] = i+2U;
        pmsg->data[3] = i+3U;
        pmsg->data[4] = i+4U;
        pmsg->data[5] = i+5U;
        pmsg->data[6] = i+6U;
        pmsg->data[7] = i+7U;
        pmsg->len = i;

        printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
                pmsg->id, pmsg->data[0], pmsg->data[1], pmsg->data[2], pmsg->data[3],
                pmsg->data[4], pmsg->data[5], pmsg->data[6], pmsg->data[7], pmsg->len);

        fifo_increase(&fifo);
        i++;
    }
    printf("\n\n\tlength:%d\n", fifo_len(&fifo));

    /*  从 FIFO 读数据    */
    printf("\n\nFIFO 读数据:\n\tlength:%d\n\n", fifo_len(&fifo));
    while(!FIFO_IS_EMPTY(&fifo))
    {
        pmsg = ((CANMsg_t *)fifo_data(&fifo)) + fifo_head(&fifo);

        printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
                pmsg->id, pmsg->data[0], pmsg->data[1], pmsg->data[2], pmsg->data[3],
                pmsg->data[4], pmsg->data[5], pmsg->data[6], pmsg->data[7], pmsg->len);

        fifo_decrease(&fifo);
    }
    printf("\n\n\tlength:%d\n", fifo_len(&fifo));

    printf("\n\nFIFO 读写数据成功！\n\tlength:%d\n", fifo_len(&fifo));

    return 0U;
}
